import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from tensorflow import keras
from tensorflow.keras import layers


class MachineLearningAlgorithms:
    @staticmethod
    def linear_regression(X, y):
        """
        线性回归算法

        参数:
        X (ndarray): 特征矩阵，形状为 (样本数, 特征数)
        y (ndarray): 目标变量，形状为 (样本数,)

        返回:
        LinearRegression: 线性回归模型

        实现步骤:
        1. 创建线性回归模型对象
        2. 使用样本数据拟合模型
        3. 返回训练好的模型

        """

        # 步骤 1: 创建线性回归模型对象
        model = LinearRegression()

        # 步骤 2: 使用样本数据拟合模型
        model.fit(X, y)

        # 步骤 3: 返回训练好的模型
        return model

    @staticmethod
    def logistic_regression(X, y):
        """
        逻辑回归算法

        参数:
        X (ndarray): 特征矩阵，形状为 (样本数, 特征数)
        y (ndarray): 目标变量，形状为 (样本数,)

        返回:
        LogisticRegression: 逻辑回归模型

        实现步骤:
        1. 创建逻辑回归模型对象
        2. 使用样本数据拟合模型
        3. 返回训练好的模型

        """

        # 步骤 1: 创建逻辑回归模型对象
        model = LogisticRegression()

        # 步骤 2: 使用样本数据拟合模型
        model.fit(X, y)

        # 步骤 3: 返回训练好的模型
        return model

    @staticmethod
    def decision_tree(X, y):
        """
        决策树算法

        参数:
        X (ndarray): 特征矩阵，形状为 (样本数, 特征数)
        y (ndarray): 目标变量，形状为 (样本数,)

        返回:
        DecisionTreeClassifier: 决策树模型

        实现步骤:
        1. 创建决策树模型对象
        2. 使用样本数据拟合模型
        3. 返回训练好的模型

        """

        # 步骤 1: 创建决策树模型对象
        model = DecisionTreeClassifier()

        # 步骤 2: 使用样本数据拟合模型
        model.fit(X, y)

        # 步骤 3: 返回训练好的模型
        return model

    @staticmethod
    def support_vector_machine(X, y):
        """
        支持向量机算法

        参数:
        X (ndarray): 特征矩阵，形状为 (样本数, 特征数)
        y (ndarray): 目标变量，形状为 (样本数,)

        返回:
        SVC: 支持向量机模型

        实现步骤:
        1. 创建支持向量机模型对象
        2. 使用样本数据拟合模型
        3. 返回训练好的模型

        """

        # 步骤 1: 创建支持向量机模型对象
        model = SVC()

        # 步骤 2: 使用样本数据拟合模型
        model.fit(X, y)

        # 步骤 3: 返回训练好的模型
        return model

    @staticmethod
    def random_forest(X, y):
        """
        随机森林算法

        参数:
        X (ndarray): 特征矩阵，形状为 (样本数, 特征数)
        y (ndarray): 目标变量，形状为 (样本数,)

        返回:
        RandomForestClassifier: 随机森林模型

        实现步骤:
        1. 创建随机森林模型对象
        2. 使用样本数据拟合模型
        3. 返回训练好的模型

        """

        # 步骤 1: 创建随机森林模型对象
        model = RandomForestClassifier()

        # 步骤 2: 使用样本数据拟合模型
        model.fit(X, y)

        # 步骤 3: 返回训练好的模型
        return model

    @staticmethod
    def neural_network(X, y):
        """
        神经网络算法

        参数:
        X (ndarray): 特征矩阵，形状为 (样本数, 特征数)
        y (ndarray): 目标变量，形状为 (样本数,)

        返回:
        keras.Sequential: 神经网络模型

        实现步骤:
        1. 创建神经网络模型对象
        2. 定义模型的结构
        3. 编译模型
        4. 使用样本数据训练模型
        5. 返回训练好的模型

        """

        # 步骤 1: 创建神经网络模型对象
        model = keras.Sequential()

        # 步骤 2: 定义模型的结构
        model.add(layers.Dense(64, activation='relu', input_shape=(X.shape[1],)))
        model.add(layers.Dense(64, activation='relu'))
        model.add(layers.Dense(1, activation='sigmoid'))

        # 步骤 3: 编译模型
        model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

        # 步骤 4: 使用样本数据训练模型
        model.fit(X, y, epochs=10, batch_size=32)

        # 步骤 5: 返回训练好的模型
        return model
